package Logica;

import java.util.List;
import java.util.ArrayList;

public class Partida {
	private List<Dado> dados;
	private int[] QtdIguaisDados = new int[7];
	private int[] resultados = new int[5];
	private List<Jogador> jogadores;
	private Jogador jogadorAtual;
	private int ordemdechegada = 0;
	private int lancamento; //Indica se o lançamento de dados  é o 1, 2 ou 3 lançamento.
	private Jogador jogadorEspecifico;
	private String ultimoQueEnviouMsg;
	private String ultimaMsg;
	private String ultimoquejogou;
	private Jogador ultimojogado;
	private String ultimoponto;
	private String ultimomarcado;
	private String jogadorvazando;
	
	public String getUltimoQueEnviouMsg() {
		return ultimoQueEnviouMsg;
	}


	public void setUltimoQueEnviouMsg(String ultimoQueEnviouMsg) {
		this.ultimoQueEnviouMsg = ultimoQueEnviouMsg;
	}
	
	public String getUltimaMsg() {
		return ultimaMsg;
	}


	public void setUltimaMsg(String ultimaMsg) {
		this.ultimaMsg = ultimaMsg;
	}
	
	public String getJogadorVazando() {
		return jogadorvazando;
	}


	public void setJogadorVazando(String jogadorvazando) {
		this.jogadorvazando = jogadorvazando;
	}
	
	public boolean IsFim(){
		if(jogadores.get(jogadores.size() - 1).getJogadas() == 0) return true;
		else return false;
		}
	
	public Jogador getJogadorEspecifico() {
		return jogadorEspecifico;
	}


	public void setJogadorEspecifico(Jogador jogadorEspecifico) {
		this.jogadorEspecifico = jogadorEspecifico;
	}
	
	public Jogador getUltimojogado() {
		return ultimojogado;
	}


	public void setUltimojogado(Jogador ultimojogado) {
		this.ultimojogado = ultimojogado;
	}


	public String getUltimoQueJogou() {
		return ultimoquejogou;
	}


	public void setUltimoQueJogou(String ultimoquejogou) {
		this.ultimoquejogou = ultimoquejogou;
	}
	
	public String getUltimoPonto() {
		return ultimoponto;
	}


	public void setUltimoPonto(String ultimoponto) {
		this.ultimoponto = ultimoponto;
	}
	
	public String getUltimoMarcado() {
		return ultimomarcado;
	}


	public void setUltimoMarcado(String ultimomarcado) {
		this.ultimomarcado = ultimomarcado;
	}
	
	public int getLancamento() {
	 	return lancamento;
	 }
	
	public int[] getResultados() {
		return resultados;
	}

	public Jogador getJogadorAtual() {
		return jogadorAtual;
	}

	public List<Jogador> getJogadores() {
		return jogadores;
	}
	
	public Jogador getJogadorEspecifico(int i) {
		return jogadores.get(i);
	}

	public void setJogadorAtual(Jogador j) {
		jogadorAtual = j;
	}

	public Partida(List<Jogador> jogadores){
		dados = new ArrayList<Dado>();
		lancamento = 1;

		for(int i = 0; i < 5; i++){
			Dado d = new Dado();
			dados.add(d);
		}

		if(jogadores.size() < 2 || jogadores.size() > 8){
			throw new IllegalArgumentException("Qtd de jogadores inválida!");
		}

		for(Jogador j: jogadores){
			j.getMetodos();
			Cartela c = new Cartela(j);
			j.setOrdemChegada(ordemdechegada);
			j.setCartela(c);

			if(j.getOrdemChegada() == 0){
				jogadorAtual = j;
			}
			ordemdechegada++;
		}

		ordemdechegada = 0;
		this.jogadores = jogadores;
	}

	public void verificarJogadorDaVez(Jogador j){
		if(j.getOrdemChegada() != jogadorAtual.getOrdemChegada()){
			throw new IllegalArgumentException("Não é a sua vez!");
		}
	}

	/**
	 * Metodo utilizado no inicio da rodada do jogador, ou seja que lança os cinco dados.
	 * @param j
	 */
	public void lancarDados(Jogador j){
		if(lancamento == 1){
			verificarJogadorDaVez(j);
			for(int i = 0; i < 5; i++){
				resultados[i] = dados.get(i).sortear(); 
			}
			lancamento++;
		}else{
			throw new IllegalArgumentException("Não é o 1 lançamento de dados!");
		}

	}

	/**
	 * Método utilizado quando o jogador for lançar apenas 1 dado.
	 * @param j Jogador que tenta lançar o dado.
	 * @param dado Numero do dado que o jogador deseja jogar.
	 */
	public void lancarDado(Jogador j, int... dado){
		//TODO Muda dado para vetor
		if(lancamento == 2 || lancamento == 3){
			verificarJogadorDaVez(j);
			for (int i = 0; i < dado.length; i++){
				Dado d = dados.get(dado[i]);
				resultados[dado[i]] = d.sortear();
			}
			lancamento++;
		}else{
			throw new IllegalArgumentException("Acabaram suas chances!");
		}
	}

	public void QtdDadoIgual(){
		int d = 0;
		for (int i = 1; i <= 6; i++)
		{
			for (int j = 0; j <= 4; j++)
			{
				if (resultados[j] == i){
					d++;
				}
			}
			QtdIguaisDados[i] = d;
			d = 0;
		}
	}

	public void MudaVez(){
		lancamento = 1;
		ordemdechegada++;
		if(ordemdechegada >= jogadores.size()){
			ordemdechegada = 0;
		}

		for(Jogador j: jogadores){
			if(j.getOrdemChegada() == ordemdechegada){
				jogadorAtual = j;
			}
		}

		for(int i = 0; i < 5; i++){
			Dado d = new Dado();
			dados.add(d);
		}

	}

	public void jogadaUm(){
		if(jogadorAtual.getUm() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int um = QtdIguaisDados[1] * 1;
				int total = jogadorAtual.getCartela().getTotal()+um;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setUm(um);
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.setUm(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		} else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
		
	}

	public void jogadaDois(){
		if(jogadorAtual.getDois() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int dois = QtdIguaisDados[2] * 2;
				int total = jogadorAtual.getCartela().getTotal()+dois;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setDois(dois);
				jogadorAtual.setDois(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		} else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
	}

	public void jogadaTres(){
		if(jogadorAtual.getTres() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int tres = QtdIguaisDados[3] * 3;
				int total = jogadorAtual.getCartela().getTotal()+tres;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setTres(tres);
				jogadorAtual.setTres(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		} else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
		
	}

	public void jogadaQuatro(){
		if(jogadorAtual.getQuatro() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int quatro = QtdIguaisDados[4] * 4;
				int total = jogadorAtual.getCartela().getTotal()+quatro;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setQuatro(quatro);
				jogadorAtual.setQuatro(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		}else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
	}

	public void jogadaCinco(){
		if(jogadorAtual.getCinco() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int cinco = QtdIguaisDados[5] * 5;
				int total = jogadorAtual.getCartela().getTotal()+cinco;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setCinco(cinco);
				jogadorAtual.setCinco(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		} else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
		
	}

	public void jogadaSeis(){
		if(jogadorAtual.getSeis() == true){
			if(lancamento == 1){
				throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
			} else {
				QtdDadoIgual();
				int seis = QtdIguaisDados[6] * 6;
				int total = jogadorAtual.getCartela().getTotal()+seis;
				jogadorAtual.getCartela().setTotal(total);
				jogadorAtual.getCartela().setSeis(seis);
				jogadorAtual.setSeis(false);
				jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
				ultimojogado = jogadorAtual;
				MudaVez();
			}
		} else {
			throw new IllegalArgumentException("Você já preencheu esse campo!");
		}
	}

	public boolean IsQuadra()
	{
		QtdDadoIgual();
		int x = 0;
		for (int i = 1; i <= 6; i++)
		{
			if (QtdIguaisDados[i] == 4)
				x = 1;
		}
		if (x == 1)
			return true;
		else return false;
	}

	public void jogadaQuadra(){
		
		if(lancamento == 1){
			throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
		} else {
			if(jogadorAtual.getQuadra() == true){
				if(IsQuadra() == true){
					QtdDadoIgual();
					int quadra;
					if (lancamento == 2) quadra = 45;
					else quadra = 40;
					int total = jogadorAtual.getCartela().getTotal()+quadra;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setQuadra(quadra);
					jogadorAtual.setQuadra(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				} else {
					QtdDadoIgual();
					int quadra = 0;
					int total = jogadorAtual.getCartela().getTotal()+quadra;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setQuadra(quadra);
					jogadorAtual.setQuadra(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				}
			} else {
				throw new IllegalArgumentException("Você já preencheu esse campo!");
			}	
		}
	}

	public boolean IsFullHouse()
	{
		QtdDadoIgual();
		int x = 0;
		int y = 0;
		for (int i = 1; i <= 6; i++)
		{
			if (QtdIguaisDados[i] == 3)
				x = 1;
		}
		for (int i = 1; i <= 6; i++)
		{
			if (QtdIguaisDados[i] == 2)
				y = 1;
		}
		if (x == 1 && y == 1)
			return true;
		else return false;
	}

	public void jogadaFullHouse(){

		if(lancamento == 1){
			throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
		} else {
			if(jogadorAtual.getFH() == true){
				if(IsFullHouse() == true){
					QtdDadoIgual();
					int FH;
					if (lancamento == 2) FH = 35;
					else FH = 30;
					int total = jogadorAtual.getCartela().getTotal()+FH;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setFullhouse(FH);
					jogadorAtual.setFH(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				} else {
					QtdDadoIgual();
					int FH = 0; 
					int total = jogadorAtual.getCartela().getTotal()+FH;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setFullhouse(FH);
					jogadorAtual.setFH(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				}
			} else {
				throw new IllegalArgumentException("Você já preencheu esse campo!");
			}	
		}
	}
	
	public boolean IsSequencia(){
		QtdDadoIgual();
		int x = 0;
		for (int i = 1; i <= 6; i++)
		{
			if (QtdIguaisDados[i] == 1)
				x++;
		}
		if (x == 5 && (QtdIguaisDados[1] == 0 || QtdIguaisDados[6] == 0))
			return true;
		else 
			return false;
	}

	public void jogadaSequencia(){

		if(lancamento == 1){
			throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
		} else {
			if(jogadorAtual.getSA() == true){
				if(IsSequencia() == true){
					QtdDadoIgual();
					int SA;
					if (lancamento == 2) SA = 55;
					else SA = 50;
					int total = jogadorAtual.getCartela().getTotal()+SA;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setSequencia(SA);
					jogadorAtual.setSA(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				} else {
					QtdDadoIgual();
					int SA = 0; 
					int total = jogadorAtual.getCartela().getTotal()+SA;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setSequencia(SA);
					jogadorAtual.setSA(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				}
			} else {
				throw new IllegalArgumentException("Você já preencheu esse campo!");
			}
		}
	}
	
	
	public boolean IsGeneral()
	{
		QtdDadoIgual();
		int x = 0;
		for (int i = 1; i <= 6; i++)
		{
			if (QtdIguaisDados[i] == 5)
				x = 1;
		}
		if (x == 1)
			return true;
		else return false;
	}

	public void jogadaGeneral(){

		if(lancamento == 1){
			throw new IllegalArgumentException("Só é possível marcar após a primeira jogada!");
		} else {
			if(jogadorAtual.getGeneral() == true){
				if(IsGeneral() == true){
					QtdDadoIgual();
					int General;
					if (lancamento == 2) General = 100;
					else General = 60;
					int total = jogadorAtual.getCartela().getTotal()+General;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setGeneral(General);
					jogadorAtual.setGeneral(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				} else {
					QtdDadoIgual();
					int General = 0; 
					int total = jogadorAtual.getCartela().getTotal()+General;
					jogadorAtual.getCartela().setTotal(total);
					jogadorAtual.getCartela().setGeneral(General);
					jogadorAtual.setGeneral(false);
					jogadorAtual.setJogadas(jogadorAtual.getJogadas()-1);
					ultimojogado = jogadorAtual;
					MudaVez();
				}
			} else {
				throw new IllegalArgumentException("Você já preencheu esse campo!");
			}	
		}
	}
}
